/* ========================================
 *
 * Copyright Nano IC, 2021-02-25
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF Nano IC.
 *
 * ========================================
*/
#ifndef  __ONE_WIRE_BUS_APP_H__
#define  __ONE_WIRE_BUS_APP_H__
#include "one_wire_bus_tra.h"


typedef struct one_wire_serial_num_s
{
    uint8_t mouse_ser;
    uint8_t keyboard_ser;
    uint8_t media_ser;
    uint8_t touch_ser;
    uint8_t g_sensor_ser;
    uint8_t user_ser;
    uint8_t para_set_ser;
    uint8_t para_set_ack_ser;
    uint8_t status_read_ser;
    uint8_t status_read_ack_ser;
    uint8_t encry_set_ser;
    uint8_t encry_ack_ser;
    uint8_t upgrade_send_ser;
    uint8_t upgrade_ack_ser;
    uint8_t iic_class_out_ser;
    uint8_t iic_class_out_ack_ser;
    uint8_t iic_class_in_ser;
    uint8_t iic_class_in_ack_ser;
    uint8_t custom_in_ser;
    uint8_t custom_in_ack_ser;
    uint8_t sys_debug_ser;
    uint8_t sys_debug_ack_ser;
    uint8_t manufactory_ser;
    uint8_t manufactory_ack_ser;
    uint8_t sync_packet_ser;
    uint8_t sync_packet_ack_ser;
}OneWireSerialNumber;

extern uint8_t kb_ack_flag;
extern uint8_t kb_ack_no_flag;
extern uint8_t rec_ack_flag;

extern uint16_t pad_serial;
extern uint16_t kb_serial;
extern uint8_t volatile global_key_power_on_flag;
//Service ID
#define Device_Management_Service       0x01
#define OTA_Service           			0x09
#define Maintenance_Serice              0x0A
#define Keyboard_Service               	0x3A
#define Factory_Service               	0x14

#define ONE_WIRE_APP_MOUSE_DATA_LENGTH              7
#define ONE_WIRE_APP_KEYBOARD_DATA_LENGTH           8
#define ONE_WIRE_APP_MEDIA_DATA_LENGTH              4
#define ONE_WIRE_APP_TOUCH_MAX_FINGER               3
#define ONE_WIRE_APP_GSENSOR_DATA_LENGTH            6
#define ONE_WIRE_APP_USER_MAX_LENGTH               64//128// 64// 32

//-----------------------------------------------------------------
#define APP_REPORT_ID_HOST_TO_DEV_32BYTE            0x0A
#define APP_REPORT_ID_HOST_TO_DEV_64BYTE            0x0B
#define APP_REPORT_ID_DEV_TO_HOST_16BYTE            0x0C
#define APP_REPORT_ID_DEV_TO_HOST_32BYTE            0x0D
#define APP_REPORT_ID_DEV_TO_HOST_64BYTE            0x0E
//-----------------------------------------------------------------
/* 读取设备程序版本 */
#define ONE_WIRE_APP_UPGRADE_READ_VERSION           0x01
/* 下传升级信息 */
#define ONE_WIRE_APP_UPGRADE_DOWNLOAD_INFO          0x02
/* 下传升级数据 */
#define ONE_WIRE_APP_UPGRADE_SEND_DATA              0x11
/* 应答下传升级数据 */
#define ONE_WIRE_APP_UPGRADE_ACK_SEND_DATA          0x91
/* 下传升级数据结束 */
#define ONE_WIRE_APP_UPGRADE_SEND_END               0x04
/* 启动升级 */
#define ONE_WIRE_APP_UPGRADE_START                  0x06
/* 系统复位 */
#define ONE_WIRE_APP_UPGRADE_SYSTEM_RESET           0x03
//-----------------------------------------------------------------
/* 读取键盘状态 */
#define ONE_WIRE_APP_READ_KB_STATUS                 0x52
/* 写键盘控制命令 */
#define ONE_WIRE_APP_WRITE_KB_CTRL_CMD              0x53
/* 获取键盘命令响应 */
#define ONE_WIRE_APP_GET_KB_CMD_RESPONSE            0x54
/* 鉴权命令 */
#define ONE_WIRE_APP_KB_AUTHENTIC_ONE               0x55
#define ONE_WIRE_APP_KB_AUTHENTIC_TWO               0x56
#define ONE_WIRE_APP_KB_AUTHENTIC_THREE             0x57
#define ONE_WIRE_APP_KB_AUTHENTIC_FOUR              0x58
/* 写入键盘NFC数据 */
#define ONE_WIRE_APP_WRITE_KB_NFC_DATA              0x5A
/* 传输自定义数据 */
#define ONE_WIRE_APP_SEND_KB_CUSTOM_DATA            0x5B
/* G-Sensor */
#define ONE_WIRE_APP_KB_GSENSOR_DATA                0x64
/* 事件上报 */
#define ONE_WIRE_APP_KB_EVENT_REPORT                0x5C
/* 查询键盘状态 */
#define ONE_WIRE_APP_GET_KB_STATUS                  0xA2
//-----------------------------------------------------------------
typedef struct one_wire_set_para_item_data_s
{
  uint8_t firmware_recover;
  uint8_t touch_pad_enable;
  uint8_t keyboard_enable;
  uint8_t backligth_enable;
  uint8_t touch_pad_sensitivity;
  uint8_t power_state;
  uint8_t led_ctrl;
  uint8_t g_sensor_rep;
  uint8_t key_sleep_state;
  uint8_t battery_level;
  uint8_t ship_mode;
  uint8_t ntc_temp;
  uint8_t charge_state;
  uint8_t key_presss_state;
  uint8_t write_ack_cmd;
}OneWireSetParaItemData;
/* 按组合键恢复出厂程序 */
#define ONE_WIRE_ITEM_CMD_FIRMWARE_RECOVER          0x20
/* 触摸板使能 */
#define ONE_WIRE_ITEM_CMD_TOUCHPAD_ENABLE           0x21
/* 键盘使能 */
#define ONE_WIRE_ITEM_CMD_KEYBOARD_ENABLE           0x22
/* 背光使能 */
#define ONE_WIRE_ITEM_CMD_BACKLIGHT_ENABLE          0x23
/* 触摸板灵敏度 */
#define ONE_WIRE_ITEM_CMD_TOUCHPAD_SENSIT           0x24
/* 键盘电源状态设置 */
#define ONE_WIRE_ITEM_CMD_POWER_STATE_SET           0x25
/* LED灯控制 */
#define ONE_WIRE_ITEM_CMD_LDE_CTRL                  0x26
/* 触发G-Sensor上报数据 */
#define ONE_WIRE_ITEM_CMD_G_SENSOR_REPORT           0x27
/* 键盘低功耗状态上报 */
#define ONE_WIRE_ITEM_CMD_SLEEP_STATE_REP           0x28
/* 电池电量 */
#define ONE_WIRE_ITEM_CMD_BATTERY_LEVEL             0x29
/* 运输模式设置 */
#define ONE_WIRE_ITEM_CMD_SHIP_MODE_SET             0x2A
/* NTC数据 */
#define ONE_WIRE_ITEM_CMD_NTC_TEMP                  0x2B
/* 充电状态 */
#define ONE_WIRE_ITEM_CMD_CHARGE_STATE              0x2C

/* 当前键按下状态 */
#define ONE_WIRE_ITEM_CMD_KEY_PREE_STATE            0x2F
/* 命令应答 */
#define ONE_WIRE_ITEM_CMD_WRITE_CMD_ACK             0x30

//-----------------------------------------------------------------

#define ONE_WIRE_BUS_TEMP_ACK_BUF_LEN      64
/*
 * @brief :单总线传输层协议初始化
 *
 * @param 
 * @return true : 成功
 * @return false : 失败
*/
bool one_wire_bus_app_init(void);

/**
 * @brief 1. 串口连续23uS(2 Byte对应时间)未收到数据，表示一帧接收完成，调用一次本函数。
 * @brief 2. 由于单总线协议规定了串口数据传输间隔，若芯片硬件不支持23uS串口超时中断，可用
 * @brief    定时器控制串口接收超时，可以超时1mS来实现。
 * @brief 3. 串口会接收到对方数据，也会接收到自已发送的数据，可能是一个包，也可能是多包接连，
 * @brief    串口接收不用关心具体数据，只关心接收超时，超时后调用本函数。
 * @brief 4. 串口接收缓冲最大长度250 Byte
 * 
 * @param p_uart_data ：串口接收数据指针
 * @param rec_len ： 串口接收到的数据长度
 * 
 * @return 
 */
void one_wire_bus_app_rec_callback(uint8_t *p_uart_data,uint16_t rec_len);

/**
 * @brief 单总线运行时钟基准，系统需要每0.5毫秒调用一次本函数
 * 
 */
void one_wire_bus_app_timer_tick_callback_0ms5(void);


void one_wire_bus_app_timer_tick_callback_500ms(void);


/**
 * @brief 打包键盘数据，并发送
 * 
 * @param ctrl_key 控制键,包括CTRL ALT SHIFT
 * @param p_key 按键值存放指针
 * @param key_num 一次要传输的按键数量 
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_send_keyboard(uint8_t ctrl_key, uint8_t *p_key,uint8_t key_num);

/**
 * @brief 打包多媒体按键数据，并发送
 * 
 * @param key_one 多媒体键值0
 * @param key_two 多媒体键值1
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_send_media_key(uint16_t key_one, uint16_t key_two);

/**
 * @brief 打包触模板数据，并发送
 * 
 * @param p_data 需要发送的触模板数据指针
 * @param finge_num 需要传输的触模点数，每点5 Byte，最多三点
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_send_touch(uint8_t *p_data, uint8_t finge_num);

/**
 * @brief 打包G-Sensor数据，并发送
 * 
 * @param p_data 需要发送的触模板数据指针
 * @param finge_num 需要传输的触模点数，每点5 Byte，最多三点
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_send_g_sensor(uint8_t* gsensor_buf);

/**
 * @brief 打包键盘自定义数据的上传
 * @brief 主要用作未定义数据的上传
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_send_keyboard_custom_data(uint8_t state,uint8_t *p_data, uint8_t len);

/**
 * @brief 打包参数设置应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_parameter_set_cmd_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 打包参数读取应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_status_read_cmd_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 打包回密认证应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_encryption_cmd_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 打包回密认证应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_upgrade_cmd_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 打包IIC类设置命令应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_iic_class_out_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 打包IIC类读取命令应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_iic_class_in_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 自定义命令应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_custom_in_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 调试命令应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_debug_in_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 生产测试命令应答数据包
 * 
 * @param p_data 需要发送的数据指针
 * @param len 需要发送的数据长度
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_app_manufactory_ack(uint8_t *p_data, uint8_t len);

/**
 * @brief 同步应答数据包
 * 

 * @return true : 成功
 * @return false : 失败
 */
 
 uint8_t one_wrie_bus_app_send_heart_beat(bool status);
 
bool one_wire_bus_app_sync_package_ack(void);


bool one_wire_bus_app_sync_reportMap(uint8_t *p_data, uint16_t len);

bool one_wire_bus_app_send_keyboard_device_data(uint8_t *p_data, uint16_t len);

bool one_wire_bus_app_send_keyboard_touchpad_data(uint8_t *p_data, uint16_t len);

uint8_t one_wrie_bus_app_send_device_info();

uint8_t one_wrie_bus_app_send_device_extend_info();

uint8_t one_wrie_bus_app_send_version_info();

uint8_t one_wrie_bus_app_awaken_cmd();

bool one_wire_bus_app_send_short_keyboard_custom_data(uint8_t state,uint8_t *p_data, uint8_t len);

bool one_wire_bus_app_send_long_keyboard_custom_data(uint8_t state,uint8_t *p_data, uint8_t len);
/**
 * @brief 调试命令收发
 */
#ifdef ENABLE_ONE_WIRE_DEBUG_FUNCTION
  bool one_wire_bus_app_debug_function(void);
#endif

#endif

/* [] END OF FILE */
